feat: DANFE Simplificado Tipo 2 (NT 2026.003)#48
Conversation
There was a problem hiding this comment.
Pull request overview
Adiciona o novo renderizador DanfeSimplificadoTipo2 (NT 2026.003, tpImp=6) para NF-e mod. 55 em layout “cupom” de largura fixa e altura dinâmica, composto por blocos empilhados (9 divisões) e com suíte de testes dedicada para validar cada divisão e cenários de contingência/altura.
Changes:
- Implementa
DanfeSimplificadoTipo2e os blocos de renderizaçãoSimplificadoTipo2/*cobrindo as 9 divisões da NT (incl. 2 vias em contingência pendente). - Estende
DanfeViewModelcomTributosIbsCbs,OperacaoNaoPresencial,ValorPagoTotaleTrocoTotal, além dePendenteAutorizacao. - Inclui especificação OpenSpec e testes MSTest (
DanfeSimplificadoTipo2Tests) + referência no.csproj.
Reviewed changes
Copilot reviewed 17 out of 17 changed files in this pull request and generated 2 comments.
Show a summary per file
| File | Description |
|---|---|
| openspec/specs/danfe-simplificado-tipo-2/spec.md | OpenSpec com requisitos e cenários por divisão (incl. contingência e não-regressão). |
| DanfeSharp/Modelo/TributosIbsCbsViewModel.cs | Novo ViewModel para totais IBS/CBS/IS (Divisão III-A). |
| DanfeSharp/Modelo/DanfeViewModel.cs | Novas propriedades para NT 2026.003 (pendência, tributos IBS/CBS, totais de pago/troco, operação não presencial). |
| DanfeSharp/Extentions.cs | Adiciona URL de consulta NF-e mod. 55 para a Divisão IV. |
| DanfeSharp/DanfeSimplificadoTipo2.cs | Novo renderizador principal com composição por blocos, metadados e estimativa de altura. |
| DanfeSharp/Blocos/SimplificadoTipo2/BlocoCabecalhoSimplificadoT2.cs | Divisão I (emitente + título). |
| DanfeSharp/Blocos/SimplificadoTipo2/TabelaProdutosSimplificadoT2.cs | Divisão II (tabela de itens). |
| DanfeSharp/Blocos/SimplificadoTipo2/BlocoTotaisSimplificadoT2.cs | Divisão III (totais, formas de pagamento, valor pago e troco sempre). |
| DanfeSharp/Blocos/SimplificadoTipo2/BlocoTributosIbsCbsT2.cs | Divisão III-A (IBS/CBS/IS; omitida quando grupo ausente). |
| DanfeSharp/Blocos/SimplificadoTipo2/BlocoConsultaChaveT2.cs | Divisão IV (URL de consulta + chave em 11 blocos). |
| DanfeSharp/Blocos/SimplificadoTipo2/BlocoQrCodeT2.cs | Divisão V (QR Code opcional). |
| DanfeSharp/Blocos/SimplificadoTipo2/BlocoConsumidorT2.cs | Divisão VI (identificação do consumidor / não identificado). |
| DanfeSharp/Blocos/SimplificadoTipo2/BlocoIdentificacaoT2.cs | Divisão VII (número/série, emissão, via, protocolo). |
| DanfeSharp/Blocos/SimplificadoTipo2/BlocoMensagemContingenciaT2.cs | Divisão VIII (mensagem de contingência pendente em 2 locais). |
| DanfeSharp/Blocos/SimplificadoTipo2/BlocoMensagensT2.cs | Divisões VIII/IX (infAdFisco, infCpl e Lei 12.741). |
| DanfeSharp.Test/DanfeSimplificadoTipo2Tests.cs | Nova suíte de testes por divisão + contingência + smoke de altura. |
| DanfeSharp.Test/DanfeSharp.Test.csproj | Inclui o novo arquivo de testes no projeto. |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
rhfranzoni
left a comment
There was a problem hiding this comment.
Code review automatizado — DANFE Simplificado Tipo 2 (NT 2026.003)
Feature bem estruturada e isolada (um bloco por divisão, zero-regressão respeitada nos leiautes existentes, .csproj de produção é SDK-style então os arquivos novos entram por globbing, e o reuso de BlocoInformacaoFiscal é geometricamente compatível com a página de 280pt). Boa cobertura de teste por divisão + contingência + smoke de altura.
Deixei 7 comentários inline. Os de maior impacto, recomendados antes do merge:
- Truncamento de
infCpl/infAdFisco(≤160 chars) — risco de fidelidade fiscal (NT exige fidelidade ao XML). - QR Code em JPEG — usar PNG (lossless) + dispor o
Bitmap.
Refinamentos menores (não bloqueiam): overflow silencioso da estimativa de altura, mutação do viewModel de input, corte do código do produto (>15 vs Substring(0,10)) + NRE potencial, campo público morto OperacaoNaoPresencial, e o parâmetro state ignorado em UrlNFeConsulta.
Triviais só de nota (não inline): a linha de homologação (bloco NFC reusado) centraliza em x=132.5 vs x=140 do restante (~7,5pt); Salvar usa SerializationModeEnum.Incremental num doc novo (Standard gera menor); e vale confirmar que .Formatar() fixa cultura pt-BR para os asserts "60,00"/"9,00" não quebrarem no CI.
Segurança: baixo risco (render de texto/imagem a partir do ViewModel; sem injeção/segredos/manipulação de path).
Revisão gerada com Claude Code.
john182
left a comment
There was a problem hiding this comment.
Gate 8 — Revisão de Código (7 perspectivas paralelas)
Revisão automatizada por 7 perspectivas independentes (Arquitetura, Segurança, Performance, Testabilidade, Observabilidade, Resiliência, Conformidade de Linguagem), adaptadas para stack .NET.
Resultado consolidado: REJEITADO — não por veto direto de nenhuma perspectiva individual (todas as 7 aprovaram isoladamente), mas pelo critério de consolidação do gate: "Duas ou mais perspectivas encontram issues ALTO no mesmo componente". Isso ocorre em BlocoQrCodeT2.cs (linha ~39): a Perspectiva de Performance encontrou o vazamento de Bitmap (já também apontado no review anterior do @rhfranzoni) e a Perspectiva de Resiliência encontrou, de forma independente, que uma falha na geração do QR Code (ex.: string malformada) propaga sem tratamento e aborta a composição de TODO o restante do documento — inclusive a 2ª via obrigatória em contingência pendente ("Via do Estabelecimento"). A combinação dos dois problemas no mesmo bloco eleva o risco: um recurso não descartado + ausência de degradação graciosa no mesmo ponto do código.
Esta revisão já encontrou o review anterior de @rhfranzoni e os comentários do Copilot no PR — os comentários abaixo cobrem apenas achados net-new das 7 perspectivas que ainda não estavam registrados (não duplico o que já foi apontado sobre vazamento de Bitmap/JPEG, mutação do viewModel, inconsistência de corte do código do produto, campo OperacaoNaoPresencial morto, ou o parâmetro state ignorado em UrlNFeConsulta).
Nota importante, para transparência: os comentários já existentes de @rhfranzoni e do Copilot apontam pelo menos 2 achados reais que as 7 perspectivas desta rodada NÃO capturaram: (1) BlocoConsumidorT2.cs:28 — detecção de CNPJ/CPF via .Trim().Length == 14 falha se o documento vier formatado com pontuação (pode rotular CNPJ como CPF), e (2) DanfeViewModel.cs:338 — campo público OperacaoNaoPresencial sem nenhum uso no PR. Ambos seguem válidos e não resolvidos.
| Perspectiva | Veredito | Achados |
|---|---|---|
| 1. Arquitetura | ✅ APROVADO | 1 MÉDIO, 2 BAIXO |
| 2. Segurança | ✅ APROVADO | 2 BAIXO |
| 3. Performance | ✅ APROVADO | 1 ALTO, 1 BAIXO |
| 4. Testabilidade | ✅ APROVADO | 3 ALTO, 2 BAIXO/MÉDIO |
| 5. Observabilidade | ✅ APROVADO | 1 BAIXO |
| 6. Resiliência | ✅ APROVADO | 1 ALTO, 1 BAIXO |
| 7. Conformidade de Linguagem | ✅ APROVADO | 1 MÉDIO, 2 BAIXO |
RESULTADO: REJEITADO (regra de consolidação, não veto individual) — recomenda-se resolver o ponto de BlocoQrCodeT2.cs (dispose do Bitmap + tratamento de falha isolando o QR do resto do documento) antes do merge. Os demais achados ALTO (cobertura de teste em ramos de truncamento) podem ir em follow-up, mas idealmente antes do próximo gate.
Revisão gerada com Claude Code (Gate 8 — revisao-codigo).
Resumo
Novo renderizador DanfeSimplificadoTipo2 — documento auxiliar em formato cupom para NF-e modelo 55 emitida com tpImp=6 (NT 2026.003 v1.00, producao 03/08/2026), nas 9 divisoes da NT:
BlocoCabecalhoSimplificadoT2TabelaProdutosSimplificadoT2BlocoTotaisSimplificadoT2BlocoTributosIbsCbsT2BlocoConsultaChaveT2vm.QrCode)BlocoQrCodeT2BlocoConsumidorT2BlocoIdentificacaoT2BlocoMensagemContingenciaT2+ reusoBlocoInformacaoFiscalBlocoMensagensT2DanfeNFC.DanfeViewModel: novosTributosIbsCbs,OperacaoNaoPresencial,PendenteAutorizacao,ValorPagoTotal,TrocoTotal.DanfeA4 eDanfeNFC).Spec OpenSpec em
openspec/specs/danfe-simplificado-tipo-2/spec.md.Testes
DanfeSimplificadoTipo2Tests(MSTest, padrao TextExtractor deDanfeCanceladaTests): 1 cenario por divisao + contingencia (4 ocorrencias da mensagem, 2 vias) + smoke de altura com 1/30/200 itens.Emissor: nfe/dfetech-product-invoice-api — issue nfe/dfetech-product-invoice-api#268 (contexto NT 2026.002/003).